package main

import (
	"fmt"
	"unicode/utf8"
)

/*
给定一个 32 位有符号整数，将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−2 31 ,  2 31 − 1]。根据这个假设，如果反转后的整数溢出，则返回 0。
 */

func reverse(x int) int {
	var nums, newnums int
	for x != 0 {
		a := x % 10
		newnums = nums*10 + a
		nums = newnums
		x = x / 10

		//题目要求其数值范围是 [−2^31,  2^31 − 1]。如果反转后的整数溢出，则返回 0。
		MaxInt32 := 1<<31 - 1
		MinInt32 := -1 << 31
		if nums > MaxInt32 || nums < MinInt32 {
			return 0
		}
	}
	return nums
}

func main() {
	//带符号的整数反转
	//fmt.Println(reverse(120))
	//字符串反转
	fmt.Println(reverseStr("Hello 中国"))
}

//字符串反转
func reverseStr(str string) (res string) {
	i:=0
	cache:= make([]byte,len(str))

	for _, v := range str {
		i+=utf8.RuneLen(v)
		utf8.EncodeRune(cache[len(str)-i:], v)
	}
	res = string(cache)
	return
}
